package work.month06.day27;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @date 2020/06/27
 * @author 王光浩
 * @need 创建一个类用于对文件进行拆分和合并
 * 		public static void split( File file , File path , int size ) —— 对文件进行拆分
 * 		public static void join( File path , File dest ) ——对文件进行合并
 */
public class FileHelper {

	/**
	 * 将 file 按照给定的 size 进行拆分，将拆分后的文件存放在 path 目录下，拆分后文件名为 file 文件名_01....
	 * @param file 需要进行拆分的文件
	 * @param path 保存拆分后文件的路径
	 * @param size 拆分后每一个文件最大的字节个数
	 */
	public static void split(File file, File path, int size) {
		if (!file.exists() || !file.isFile())
			throw new IllegalArgumentException("被拆分的文件不存在");
		if (!path.exists() || !path.isDirectory())
			throw new IllegalArgumentException("目标位置不存在或不有效目录");
		byte[] buffer = new byte[size];
		InputStream in = null;
		OutputStream out = null;
		File temp = null;
		int len = 0;
		try {
			in = new FileInputStream(file);
			int index = 1;
			// 将 file 中的内容按照 size大小 依次读取出
			while ((len = in.read(buffer)) != -1) {
				// 在对应 path 目录下创建一个新的文件
				temp = new File(path.getCanonicalPath() + "/" + file.getName() + "_" + index++);
				if (!temp.exists())
					temp.createNewFile();
				// 将数据写入到对应的文件中
				try {
					out = new FileOutputStream(temp);
					out.write(buffer, 0, len);
				} catch (IOException e) {
					System.out.println("文件写入异常");
				} finally {
					out.close();
				}
			}
		} catch (IOException e) {
			System.out.println("文件读出异常");
		} finally {
			if (in != null)
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			System.out.println("分割成功");
		}
	}

	/**
	 * 将 path 目录中所有的文件按照次序（目前这个次序就是获取的先后顺序）进行合并，将合并之后的内容写入到 dest 对应的文件中
	 * @param path 需要合并文件的目录
	 * @param dest 合并之后内容的存放文件
	 */
	public static void join(File path, File dest) {
		if ( !path.exists() || !path.isDirectory() )
			throw new IllegalArgumentException("需要合并的目录不正确");
		if ( !dest.exists() || !dest.isFile() )
			throw new IllegalArgumentException("合并之后的大文件的存储的文件不正确");
		InputStream in = null;
		OutputStream out = null;
		byte[] buffer = null;
		try {
			// 将 path 目录下的文件依次写入到 dest 文件中
			out = new FileOutputStream(dest, true);
			File[] listFiles = path.listFiles();
			for ( File f : listFiles ) {
				buffer = new byte[(int)f.length()];
				try {
					in = new FileInputStream(f);
					in.read(buffer);
				} catch (IOException e) {
					System.out.println("读入数据出现问题");
				} finally {
					if (in != null)
						try {
							in.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
				}				
				out.write(buffer);
			}
		} catch (IOException e) {
			System.out.println("写入数据出现问题");
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		File dest = new File("D:/wang1.txt");
		File path = new File("D:/te");
		FileHelper.join(path, dest);
	}

}
